import { Request, Response, NextFunction } from 'express';
import ApiResponse from '@/utils/api/api-response.util';
import { isEmpty } from '../common/validation.util';
import sysConfigService from '@/services/system/sys-config.service';
import { getLogger } from '@/utils/logger';
import { AuthRequest } from '@/types';

const logger = getLogger('config-validator', { console: false });
const consoleLogger = getLogger('config-validator');

/**
 * 验证获取参数详细信息的参数
 */
export const validateConfigInfo = async (req: Request, res: Response, next: NextFunction) => {
  try {
    const configId = Number(req.params.configId);
    
    if (isNaN(configId) || configId <= 0) {
      consoleLogger.warn('获取参数详细信息参数无效', { configId: req.params.configId });
      return ApiResponse.error(res, '无效的参数ID', 400);
    }
    
    // 校验参数是否存在
    const config = await sysConfigService.getConfigById(configId);
    if (!config) {
      logger.warn('获取参数详细信息失败: 参数不存在', { configId });
      return ApiResponse.error(res, '参数不存在', 404);
    }
    
    logger.debug('获取参数详细信息参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`获取参数详细信息验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
};

/**
 * 验证根据参数键名查询参数值的参数
 */
export const validateConfigKey = async (req: Request, res: Response, next: NextFunction) => {
  try {
    const { configKey } = req.params;
    
    if (isEmpty(configKey)) {
      consoleLogger.warn('根据参数键名查询参数值参数无效', { configKey });
      return ApiResponse.error(res, '参数键名不能为空', 400);
    }
    
    logger.debug('根据参数键名查询参数值参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`根据参数键名查询参数值验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
};

/**
 * 验证新增参数配置的参数
 */
export const validateConfigCreate = async (req: Request, res: Response, next: NextFunction) => {
  try {
    const { configName, configKey, configValue } = req.body;
    
    // 参数名称验证
    if (isEmpty(configName)) {
      return ApiResponse.error(res, '参数名称不能为空', 400);
    }
    
    // 参数键名验证
    if (isEmpty(configKey)) {
      return ApiResponse.error(res, '参数键名不能为空', 400);
    }
    
    // 参数键值验证
    if (isEmpty(configValue)) {
      return ApiResponse.error(res, '参数键值不能为空', 400);
    }
    
    // 校验参数键名是否唯一
    if (!(await sysConfigService.checkConfigKeyUnique(configKey))) {
      consoleLogger.warn('新增参数配置失败: 参数键名已存在', { configKey });
      return ApiResponse.error(res, `新增参数'${configName}'失败，参数键名已存在`, 400);
    }
    
    logger.debug('新增参数配置参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`新增参数配置验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
};

/**
 * 验证修改参数配置的参数
 */
export const validateConfigEdit = async (req: Request, res: Response, next: NextFunction) => {
  try {
    const { configId, configName, configKey, configValue } = req.body;
    
    if (isEmpty(configId) || isNaN(parseInt(configId))) {
      return ApiResponse.error(res, '参数ID不能为空', 400);
    }
    
    if (isEmpty(configName)) {
      return ApiResponse.error(res, '参数名称不能为空', 400);
    }
    
    if (isEmpty(configKey)) {
      return ApiResponse.error(res, '参数键名不能为空', 400);
    }
    
    if (isEmpty(configValue)) {
      return ApiResponse.error(res, '参数键值不能为空', 400);
    }
    
    const cId = parseInt(configId);
    
    // 校验参数是否存在
    const config = await sysConfigService.getConfigById(cId);
    if (!config) {
      logger.warn('修改参数配置失败: 参数不存在', { configId: cId });
      return ApiResponse.error(res, '修改参数配置失败，参数不存在', 400);
    }
    
    // 校验参数键名是否唯一
    if (!(await sysConfigService.checkConfigKeyUnique(configKey, cId))) {
      logger.warn('修改参数配置失败: 参数键名已存在', { configKey });
      return ApiResponse.error(res, `修改参数'${configName}'失败，参数键名已存在`, 400);
    }
    
    logger.debug('修改参数配置参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`修改参数配置验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
};

/**
 * 验证删除参数配置的参数
 */
export const validateConfigRemove = async (req: AuthRequest, res: Response, next: NextFunction) => {
  try {
    const configIds = req.params.configIds.split(',').map(id => parseInt(id));
    
    if (!configIds.length || configIds.some(id => isNaN(id) || id <= 0)) {
      return ApiResponse.error(res, '参数ID无效', 400);
    }
    
    // 校验参数是否存在
    for (const configId of configIds) {
      const config = await sysConfigService.getConfigById(configId);
      if (!config) {
        logger.warn('删除参数配置失败: 参数不存在', { configId });
        return ApiResponse.error(res, `删除参数配置失败，ID为${configId}的参数不存在`, 400);
      }
    }
    
    logger.debug('删除参数配置参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`删除参数配置验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
}; 